home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / webx / pws010.lzh / PersonalWS.c < prev    next >
C/C++ Source or Header  |  1998-09-11  |  4KB  |  173 lines

  1. /* PersonelWS.c */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/dos.h>
  6.  
  7. #define MY_USER_STACK    48*1024
  8. #define MY_SUPER_STACK    32*1024
  9.  
  10. extern int ReceiveMessage (int );
  11. extern int SendCommand (int , char *);
  12. extern int OpenSock(char *, int );
  13. extern int OpenPassiveSock (int port);
  14. extern int ServerInit(void);
  15. extern int ServerMain(void);
  16. extern int ServerTini(void);
  17. extern void CloseSock(int );
  18.  
  19.  
  20. /* ï⌠ÉöâAâhâîâXé╔É«ìçé╖éΘé╜é▀é╔éφé┤éφé┤ short é┼ÉΘî╛é╡é─éóéΘ */
  21. /* char é╞é⌐é┼ÉΘî╛é╖éΘé╞âXâ^âbâNé╠ÆΩé¬è∩ÉöâAâhâîâXé╔É▌ÆΦé│éΩé╜éΦé│éΩé╚é⌐é┴é╜éΦ */
  22. short user_stack[MY_USER_STACK / 2];
  23. short super_stack[MY_SUPER_STACK / 2];
  24.  
  25. char *id_str = "PersonalWS";    /* ÅφÆôÄ»ò╩ùpò╢ÄÜù± */
  26. struct _prcctrl buff;
  27. char *base_dir = ".";
  28. char *quit_str = "QUIT";
  29. int v_option = 0;
  30.  
  31.  
  32.  
  33. /* âXâ^âbâNâTâCâYé╞âqü[âvâTâCâYé≡ÄwÆΦ */
  34. int _stacksize = 32 * 1024;
  35. int _heapsize = 256 * 1024;
  36.  
  37. void usage (void)
  38. {
  39.     printf ("âpü[â\âiâïâEâFâuâTü[âoü[ PersonalWS.x ver0.10\n"
  40.         "        programmed by Mitsuky <FreeSoftware>\n"
  41.         "âEâFâuâTü[âoü[é┼é╖\n"
  42.         "Ägùpû@ : PersonalWS [option] [âxü[âXâfâBâîâNâgâè]\n"
  43.         "[option]\n"
  44.         "    -V : Å┌ì╫ò\Īâéü[âh\n"
  45.         "    -Qò╢ÄÜù± : ÅIù╣ò╢ÄÜù±üiû│ÄwÆΦÄ₧é═ QUIT üj\n"
  46.         "    -R : ÅφÆôë≡Å£\n"
  47.         "âxü[âXâfâBâîâNâgâèé≡Å╚ù¬é╖éΘé╞âJâîâôâgâfâBâîâNâgâèé≡âxü[âXé╞é╡é▄é╖\n"
  48.         "éaéfâvâìâZâXé┼ô«ì∞é╖éΘé╠é┼ Human68K ver.2 ê╚ì~üA\n"
  49.         "é⌐é┬ CONFIG.SYS é┼ PROCESS = é╠É▌ÆΦé≡é╖éΘòKùvé¬éáéΦé▄é╖\n"
  50.         );
  51. }
  52.  
  53.  
  54. /* ÅφÆôòö */
  55. void keepent (void)
  56. {
  57.     for (;;) {
  58.         if (buff.your_id != 0xffff) {
  59.             /* âXâîâbâhè╘Æ╩ÉMé¬éáé┴é╜ÅΩìç */
  60.             int th_command;
  61.  
  62.             th_command = buff.command;
  63.             buff.your_id = 0xffff;    /* æùéΦÄΦé╠âXâîâbâhéhécé≡ -1 é╔ */
  64.  
  65.             if (th_command == 0xfff9) {    /* Ä⌐ÄEâRâ}âôâhüH */
  66.                 ServerTini();
  67.                 _dos_kill_pr ();
  68.             }
  69.         } else {
  70.             /* âXâîâbâhè╘Æ╩ÉMé¬é╚é⌐é┴é╜ÅΩìç */
  71.             if (ServerMain()<0){
  72.                 ServerTini();
  73.                 _dos_kill_pr ();
  74.             }
  75.             _dos_change_pr();
  76.         }
  77.     }
  78. }
  79.  
  80.  
  81. int main (int argc, char *argv[])
  82. {
  83.     int i;
  84.     int slash_flag = 0;
  85.     struct _prcptr prc;
  86.     int my_id, your_id;
  87.     int r_option = 0;
  88.  
  89.     {
  90.         char *temp;
  91.  
  92.         temp = getenv ("SLASH");
  93.         if ((temp != NULL) && (*temp == '/')) {
  94.             slash_flag = 1;
  95.         }
  96.     }
  97.  
  98.     for (i = 1; i < argc; i++) {
  99.         if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
  100.             switch (*(argv[i] + 1)) {
  101.  
  102.             case 'r':
  103.             case 'R':
  104.                 r_option = !0;
  105.                 break;
  106.  
  107.             case 'v':
  108.             case 'V':
  109.                 v_option = !0;
  110.                 break;
  111.  
  112.             case 'q':
  113.             case 'Q':
  114.                 quit_str=argv[i]+2;
  115.                 break;
  116.  
  117.             default:
  118.                 usage ();
  119.                 return (-1);
  120.             }
  121.         } else {
  122.             base_dir = argv[i];
  123.         }
  124.     }
  125.  
  126.     my_id = _dos_get_pr (-2, &prc);
  127.     strcpy (prc.name, id_str);
  128.     if ((your_id = _dos_get_pr (-1, &prc)) < 0) {
  129.         if (!r_option) {
  130.             /* ÅφÆôé╡é─éóé╚éóÅΩìçé═ÅφÆô */
  131.             struct _psp *my_psp;
  132.             void *mem_top,*mem_last;
  133.  
  134.             if (ServerInit())
  135.                 return(-1);
  136.             printf ("ÅφÆôé╡é▄é╖\n");
  137.             buff.length = 0;
  138.             buff.command = 0xffff;
  139.             buff.your_id = -1;
  140.             _dos_open_pr (id_str, 2, (int) &user_stack[MY_USER_STACK / 2], (int) &super_stack[MY_SUPER_STACK / 2], 0, (int) &keepent, &buff, 1);
  141.             my_psp = _dos_getpdb ();
  142.             mem_top = (int *) ((int)my_psp - 0x10);
  143.             mem_last = (int *)(*(int *)((int)mem_top + 0x08));
  144.             _dos_keeppr ((int)mem_last-(int)mem_top - (0x10 + 0xf0), 0);
  145.         } else {
  146.             printf ("é▄é╛ÅφÆôé╡é─éóé▄é╣é±\n");
  147.             return (-1);
  148.         }
  149.     } else {
  150.         if (r_option) {
  151. #if    0
  152.             /* è∙é╔ÅφÆôé╡é─éóé╜ÅΩìçé═Ä⌐ÄEâRâ}âôâhé≡æùéΘ */
  153.             ServerTini();
  154.             while (_dos_send_pr (my_id, your_id, 0xfff9, NULL, 0) == -28)
  155.                 _dos_change_pr ();
  156. #endif
  157.             int temp_sock;
  158.             char temp_str[256];
  159.             temp_sock = OpenSock("localhost",80);
  160.             sprintf (temp_str, "GET /%s HTTP/1.0\r\n\r\n",quit_str);
  161.             SendCommand(temp_sock,temp_str);
  162.             ReceiveMessage(temp_sock);
  163.             CloseSock(temp_sock);
  164.  
  165.             printf ("ÅφÆôë≡Å£é╡é▄é╡é╜\n");
  166.         } else {
  167.             printf ("è∙é╔ÅφÆôé╡é─éóé▄é╖\n");
  168.             return (-1);
  169.         }
  170.     }
  171.     return (0);
  172. }
  173.